//User constructor function
function User(name, interests) {
    this.name = name;
    this.interests = interests;
    //*****
    //this.greeting = function() {
    //    console.log('Hi1, I\'m ' + this.name + '.');
    //}
}

User.prototype.greeting = function () {
    console.log('Hi2, I\'m ' + this.name + '.');
}

//继承的方法
/*
创建一个TeamMember构造函数，并在其中调用User构造函数的call()方法，
该方法从Function对象继承到链构造函数，这类似于在Java类的构造函数中调用super()。
一个区别是call()方法的第一个参数必须是一个对象，它充当执行上下文(execution context)。
在示例中，将其用作执行上下文。在call()方法中，初始化name和interests属性。
然后，向TeamMember添加一个附加属性Tasks。
*/
function TeamMember(name, interests, tasks) {
    //调用User的call继承, 类似Java中的super
    User.call(this, name, interests);
    this.tasks = tasks;
}

/*
使用Object.create()使用User prototype object创建一个TeamMember prototype object。
这样，由TeamMember构造函数创建的对象将具有User原型对象的属性，
并且每个TeamMember对象将具有链接到此TeamMember原型的__proto__属性
*/
TeamMember.prototype = Object.create(User.prototype);
//两个的prototype不是同一个对象
console.log(User.prototype === TeamMember.prototype);  // false
//两个的prototype有相同的构造函数
console.log(User.prototype.constructor === TeamMember.prototype.constructor);  // false


var member = new TeamMember("Jack", ['Traveling'], ['Buy three tickets', 'Book a hotel']);
member.greeting();  //Hi2, I'm Jack.


//覆盖greeting
TeamMember.prototype.greeting = function () {
    console.log('I\'m ' + this.name + '. Welcome to the team!');
}
member.greeting()  //I'm Jack. Welcome to the team!

//TeamMember新增一个函数
TeamMember.prototype.work = function() {
    console.log('I\'m working on ' + this.tasks.length + ' tasks');
}

member.work();  //I'm working on 2 tasks

//查看继承关系
console.log(member instanceof TeamMember)   //true
console.log(member instanceof User)         //true
console.log(member instanceof Object)       //true

//User的prototype加入个函数
User.prototype.eat = function() {
    console.log('What will I have for lunch?');
}
member.eat();   //What will I have for lunch?

//Object的prototype加入个函数
//Object是所有对象的根
Object.prototype.move = function() {
    console.log('Every object can move now');
}
member.move();  //Every object can move now

//任何对象都可以调用move函数
var alien = {}
alien.move();  //Every object can move now

// User构造函数也能调用move
User.move();      //Every object can move now


//子类构造函数的__proto__指向父类的prototype指向的对象相同
//实例的__proto__指向类的prototype指向的对象相同
console.log(member.__proto__ ===TeamMember.prototype);   //true
console.log(TeamMember.prototype.__proto__ === User.prototype);//true
console.log(User.prototype.__proto__ == Object.prototype);//true

//prototype.isPrototypeof() 来判断
console.log(TeamMember.prototype.isPrototypeOf(member));  //true

//判断在自己定义的属性
console.log(member.hasOwnProperty('name'));   //true
console.log(member.hasOwnProperty('move'));   //false